04 / 06

How do you implement rate limiting in a Go API — per user, per IP, and globally?

Use the token bucket algorithm from golang.org/x/time/rate for single-instance rate limiting. For distributed rate limiting across multiple instances, use Redis with atomic Lua scripts.

Rate limiting middleware
Rate limiting strategies
  1. 1

    Token bucket (golang.org/x/time/rate): allows bursts up to bucket capacity, refills at a constant rate

  2. 2

    Sliding window: more accurate than fixed window, prevents burst at window boundaries

  3. 3

    Per-user rate limits are more fair than per-IP for authenticated APIs — use user ID from JWT

  4. 4

    Redis-cell (redis module) or Lua scripts for distributed rate limiting across service instances

  5. 5

    Return Retry-After header with 429 responses to help well-behaved clients back off